const express = require('express');
const boom = require('boom');
const userRouter = require('./user');
const bookRouter = require('./book');
const videoRouter = require('./video');
const { jwtAuth } = require('../utils');
const Result = require('../models/result');

// 注册路由
const router = express.Router();

// 拦截所有路由，判断请求头是否含有Authorization字段
// 如果有则解析Authorization中的token值，并挂载在req.user上
// 如果没有则返回{name:"UnauthorizedError"}的错误
router.use(jwtAuth);

// 通过 userRouter 来处理 /user 路由，对路由处理进行解耦
router.get('/', function (req, res) {
	res.send('欢迎来到管理后台');
});
router.use('/user', userRouter);
router.use('/book', bookRouter);
router.use('/video', videoRouter);

/**
 * 集中处理404请求的中间件
 * 注意：该中间件必须放在正常处理流程之后
 * 否则，会拦截正常请求
 */
router.use((req, res, next) => {
	next(boom.notFound('接口不存在'));
});

/**
 * 自定义路由异常处理中间件
 * 注意两点：
 * 第一，方法的参数不能减少
 * 第二，方法的必须放在路由最后
 */
router.use((err, req, res, next) => {
	if (err.name === 'UnauthorizedError') {
		// 处理express-jwt抛出的错误
		new Result(null, 'token失效', {
			error: err.status,
			errorMsg: err.name
		}).expired(res.status(err.status));
	} else {
		// 处理boom抛出的错误对象,会被err参数接收
		// {
		//     Error: username类型不正确,
		// 	   data: null,
		//     isBoom: true,
		//     isServer: false,
		//     output:{ 
		//     	   statusCode: 400,
		// 	       payload:{ 
		//             statusCode: 400,
		// 	           error: 'Bad Request',
		// 	           message: 'username类型不正确' 
		//         },
		// 	       headers: {} 
		//     },
		//     reformat: [Function],
		//     typeof: [Function: badRequest]
		// }
		const msg = (err && err.message) || '系统错误';
		const statusCode = (err.output && err.output.statusCode) || 500;
		const errorMsg = (err.output && err.output.payload && err.output.payload.error) || err.message;
		new Result(null, msg, {
			error: statusCode,
			errorMsg
		}).fail(res.status(statusCode));
	}
})

module.exports = router;